package cyx.example.ddd.domain.shared;

import lombok.Getter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 聚合根基类
 * 所有的聚合根都应该继承此类
 * 
 * 注意：这是一个示例实现，在实际企业项目中，可能需要考虑：
 * 1. 事件版本管理
 * 2. 事件持久化
 * 3. 事件重放机制
 * 4. 事件冲突检测
 */
@Getter
public abstract class AggregateRoot<ID> extends Entity<ID> {

    /**
     * 聚合根版本号，用于乐观锁
     */
    private int version = 0;

    /**
     * 领域事件列表
     */
    private final List<DomainEvent> domainEvents = new ArrayList<>();

    /**
     * 添加领域事件
     * 
     * @param event 领域事件
     */
    protected void addDomainEvent(DomainEvent event) {
        domainEvents.add(event);
    }

    /**
     * 清除领域事件
     * 通常在事件发布后调用
     */
    public void clearDomainEvents() {
        domainEvents.clear();
    }

    /**
     * 获取领域事件（不可修改）
     * 
     * @return 领域事件列表的不可修改视图
     */
    public List<DomainEvent> getDomainEvents() {
        return Collections.unmodifiableList(domainEvents);
    }

    /**
     * 增加版本号
     * 在聚合根状态变更时调用
     */
    protected void incrementVersion() {
        this.version++;
    }

    /**
     * 设置版本号
     * 通常用于从持久化恢复聚合根时
     * 
     * @param version 版本号
     */
    public void setVersion(int version) {
        this.version = version;
    }
}